From: akw27@labyrinth.cl.cam.ac.uk Date: Mon, 16 Dec 2002 11:50:19 +0000 (+0000) Subject: bitkeeper revision 1.7.1.8 (3dfdbdfbe2pZAGaXI4oPfJVdSW3qpg) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~19116^2~2 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=81ba86ae162497f411a3ac68865c8fc867b4cc6e;p=xen.git bitkeeper revision 1.7.1.8 (3dfdbdfbe2pZAGaXI4oPfJVdSW3qpg) minor cleaning up. --- diff --git a/xen-2.4.16/common/network.c b/xen-2.4.16/common/network.c index 69b4294950..64c32a704f 100644 --- a/xen-2.4.16/common/network.c +++ b/xen-2.4.16/common/network.c @@ -1,8 +1,11 @@ -/* net_ring.c +/* network.c * - * ring data structures for buffering messages between hypervisor and - * guestos's. As it stands this is only used for network buffer exchange. + * Network virtualization for Xen. Lower-level network interactions are in + * net/dev.c and in the drivers. This file contains routines to interact + * with the virtual interfaces (vifs) and the virtual firewall/router through + * the use of rules. * + * Copyright (c) 2002, A K Warfield and K A Fraser */ #include @@ -18,19 +21,30 @@ /* vif globals * sys_vif_list is a lookup table for vifs, used in packet forwarding. - * it should be replaced later by something a little more flexible. + * it will be replaced later by something a little more flexible. */ -int sys_vif_count; -net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS]; -net_rule_ent_t *net_rule_list; -kmem_cache_t *net_vif_cache; +int sys_vif_count; /* global vif count */ +net_vif_t *sys_vif_list[MAX_SYSTEM_VIFS]; /* global vif array */ +net_rule_ent_t *net_rule_list; /* global list of rules */ +kmem_cache_t *net_vif_cache; kmem_cache_t *net_rule_cache; -static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED; -static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED; +static rwlock_t net_rule_lock = RW_LOCK_UNLOCKED; /* rule mutex */ +static rwlock_t sys_vif_lock = RW_LOCK_UNLOCKED; /* vif mutex */ void print_net_rule_list(); + +/* ----[ VIF Functions ]----------------------------------------------------*/ + +/* create_net_vif - Create a new vif and append it to the specified domain. + * + * the domain is examined to determine how many vifs currently are allocated + * and the newly allocated vif is appended. The vif is also added to the + * global list. + * + */ + net_vif_t *create_net_vif(int domain) { net_vif_t *new_vif; @@ -65,9 +79,12 @@ net_vif_t *create_net_vif(int domain) return new_vif; } -/* delete the last vif in the given domain. There doesn't seem to be any reason - * (yet) to be able to axe an arbitrary vif, by vif id. +/* delete_net_vif - Delete the last vif in the given domain. + * + * There doesn't seem to be any reason (yet) to be able to axe an arbitrary + * vif, by vif id. */ + void destroy_net_vif(struct task_struct *p) { struct sk_buff *skb; @@ -88,6 +105,9 @@ void destroy_net_vif(struct task_struct *p) kmem_cache_free(net_vif_cache, p->net_vif_list[i]); } +/* print_vif_list - Print the contents of the global vif table. + */ + void print_vif_list() { int i; @@ -103,6 +123,11 @@ void print_vif_list() } } +/* ----[ Net Rule Functions ]-----------------------------------------------*/ + +/* add_net_rule - Add a new network filter rule. + */ + int add_net_rule(net_rule_t *rule) { net_rule_ent_t *new_ent; @@ -122,6 +147,9 @@ int add_net_rule(net_rule_t *rule) return 0; } +/* delete_net_rule - Delete an existing network rule. + */ + int delete_net_rule(net_rule_t *rule) { net_rule_ent_t *ent = net_rule_list, *prev = NULL; @@ -148,10 +176,12 @@ int delete_net_rule(net_rule_t *rule) return 0; } -/* add_default_net_rule. +/* add_default_net_rule - Set up default network path (ie for dom0). + * * this is a utility function to route all traffic with the specified * ip address to the specified vif. It's used to set up domain zero. */ + void add_default_net_rule(int vif_id, u32 ipaddr) { net_rule_t new_rule; @@ -178,6 +208,9 @@ void add_default_net_rule(int vif_id, u32 ipaddr) } +/* print_net_rule - Print a single net rule. + */ + void print_net_rule(net_rule_t *r) { printk("===] NET RULE:\n"); @@ -195,11 +228,18 @@ void print_net_rule(net_rule_t *r) printk("=] action : %u\n", r->action); } +/* print_net_rule_list - Print the global rule table. + */ + void print_net_rule_list() { - net_rule_ent_t *ent = net_rule_list; + net_rule_ent_t *ent; int count = 0; + read_lock(&net_rule_lock); + + ent = net_rule_list; + while (ent) { print_net_rule(&ent->r); @@ -207,10 +247,14 @@ void print_net_rule_list() count++; } printk("\nTotal of %d rules.\n", count); + + read_unlock(&net_rule_lock); } -/* Apply the rules to this skbuff and return the vif id that it is bound for. - * -1 to drop. +/* net_find_rule - Find the destination vif according to the current rules. + * + * Apply the rules to this skbuff and return the vif id that it is bound for. + * If there is no match, VIF_DROP is returned. */ int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port, u16 dst_port, @@ -252,6 +296,25 @@ int net_find_rule(u8 nproto, u8 tproto, u32 src_addr, u32 dst_addr, u16 src_port return dest; } +/* net_get_target_vif - Find the vif that the given sk_buff is bound for. + * + * This is intended to be the main interface to the VFR rules, where + * net_find_rule (above) is a private aspect of the current matching + * implementation. All in-hypervisor routing should use this function only + * to ensure that this can be rewritten later. + * + * Currently, network rules are stored in a global linked list. New rules are + * added to the front of this list, and (at present) the first matching rule + * determines the vif that a packet is sent to. This is obviously not ideal, + * it might be more advisable to have chains, or at lest most-specific + * matching, and moreover routing latency increases linearly (for old rules) + * as new rules are added. + * + * net_get_target_vif examines the sk_buff and pulls out the relevant fields + * based on the packet type. it then calls net_find_rule to scan the rule + * list. + */ + int net_get_target_vif(struct sk_buff *skb) { int target = VIF_DROP; @@ -296,6 +359,8 @@ int net_get_target_vif(struct sk_buff *skb) return VIF_DROP; } +/* ----[ Syscall Interface ]------------------------------------------------*/ + /* * This is the hook function to handle guest-invoked traps requesting * changes to the network system. diff --git a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h index c8ba7f278e..ad3fb2cfa8 100644 --- a/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h +++ b/xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h @@ -44,127 +44,6 @@ typedef struct #define TRAP_INSTR "int $0x82" -static inline int HYPERVISOR_set_trap_table(trap_info_t *table) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table), - "b" (table) ); - - return ret; -} - - -static inline int HYPERVISOR_pt_update(page_update_request_t *req, int count) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_pt_update), - "b" (req), "c" (count) ); - - return ret; -} - - -static inline int HYPERVISOR_console_write(const char *str, int count) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_console_write), - "b" (str), "c" (count) ); - - - return ret; -} - -static inline int HYPERVISOR_set_pagetable(unsigned long ptr) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_pagetable), - "b" (ptr) ); - - return ret; -} - -static inline int HYPERVISOR_set_guest_stack( - unsigned long ss, unsigned long esp) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_guest_stack), - "b" (ss), "c" (esp) ); - - return ret; -} - -static inline int HYPERVISOR_net_update(void) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_net_update) ); - - return ret; -} - -static inline int HYPERVISOR_fpu_taskswitch(void) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) ); - - return ret; -} - -static inline int HYPERVISOR_yield(void) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_yield) ); - - return ret; -} - -static inline int HYPERVISOR_exit(void) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_exit) ); - - return ret; -} - -static inline int HYPERVISOR_dom0_op(void *dom0_op) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_dom0_op), - "b" (dom0_op) ); - - return ret; -} - -static inline int HYPERVISOR_network_op(void *network_op) -{ - int ret; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_network_op), - "b" (network_op) ); - - return ret; -} - /* Event message note: * * Here, as in the interrupts to the guestos, additional network interfaces diff --git a/xen-2.4.16/include/xeno/vif.h b/xen-2.4.16/include/xeno/vif.h index 2a2612ec70..1bef565c32 100644 --- a/xen-2.4.16/include/xeno/vif.h +++ b/xen-2.4.16/include/xeno/vif.h @@ -1,7 +1,9 @@ /* vif.h * - * this is the hypervisor end of the network code. The net_ring structure + * This is the hypervisor end of the network code. The net_ring structure * stored in each vif is placed on a shared page to interact with the guest VM. + * + * Copyright (c) 2002, A K Warfield and K A Fraser */ /* virtual network interface struct and associated defines. */ @@ -26,7 +28,7 @@ typedef struct net_vif_st { /* VIF-related defines. */ #define MAX_GUEST_VIFS 2 // each VIF is a small overhead in task_struct -#define MAX_SYSTEM_VIFS 256 // trying to avoid dynamic allocation +#define MAX_SYSTEM_VIFS 256 /* vif globals */ extern int sys_vif_count; diff --git a/xen-2.4.16/net/dev.c b/xen-2.4.16/net/dev.c index cd3a4e38d3..5c4d999bf3 100644 --- a/xen-2.4.16/net/dev.c +++ b/xen-2.4.16/net/dev.c @@ -687,7 +687,6 @@ int netif_rx(struct sk_buff *skb) unsigned long cpu_mask; #endif struct task_struct *p; -// unsigned int dest_dom; int this_cpu = smp_processor_id(); struct softnet_data *queue; unsigned long flags; @@ -703,58 +702,29 @@ int netif_rx(struct sk_buff *skb) local_irq_save(flags); netdev_rx_stat[this_cpu].total++; -/* - skb->h.raw = skb->nh.raw = skb->data; - - if ( skb->len < 2 ) goto drop; - switch ( ntohs(skb->mac.ethernet->h_proto) ) - { - case ETH_P_ARP: - if ( skb->len < 28 ) goto drop; - dest_dom = ntohl(*(unsigned long *) - (skb->nh.raw + 24)); - break; - case ETH_P_IP: - if ( skb->len < 20 ) goto drop; - dest_dom = ntohl(*(unsigned long *) - (skb->nh.raw + 16)); - break; - default: - goto drop; - } - - if ( (dest_dom < opt_ipbase) || - (dest_dom > (opt_ipbase + 16)) ) - goto drop; - - dest_dom -= opt_ipbase; - - read_lock(&tasklist_lock); - p = &idle0_task; - do { - if ( p->domain != dest_dom ) continue; - skb_queue_tail(&p->net_vif_list[0]->skb_list, skb); // vfr will fix. - cpu_mask = mark_hyp_event(p, _HYP_EVENT_NET_RX); - read_unlock(&tasklist_lock); - goto found; - } - while ( (p = p->next_task) != &idle0_task ); - read_unlock(&tasklist_lock); - goto drop; -*/ + if (skb->src_vif == VIF_UNKNOWN_INTERFACE) skb->src_vif = VIF_PHYSICAL_INTERFACE; if (skb->dst_vif == VIF_UNKNOWN_INTERFACE) net_get_target_vif(skb); -if (skb->dst_vif > 1) -printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif); + if (sys_vif_list[skb->dst_vif] == NULL) { // the target vif does not exist. goto drop; } + /* This lock-and-walk of the task list isn't really necessary, and is an + * artifact of the old code. The vif contains a pointer to the skb list + * we are going to queue the packet in, so the lock and the inner loop + * could be removed. + * + * The argument against this is a possible race in which a domain is killed + * as packets are being delivered to it. This would result in the dest vif + * vanishing before we can deliver to it. + */ + if ( skb->dst_vif >= VIF_PHYSICAL_INTERFACE ) { read_lock(&tasklist_lock); @@ -770,19 +740,6 @@ printk("netifrx got packet bound for system vif %d.\n", skb->dst_vif); read_unlock(&tasklist_lock); goto drop; } -// found: -#if 0 - __skb_queue_tail(&queue->input_pkt_queue,skb); - /* Runs from irqs or BH's, no need to wake BH */ - cpu_raise_softirq(this_cpu, NET_RX_SOFTIRQ); - local_irq_restore(flags); - get_sample_stats(this_cpu); - return softnet_data[this_cpu].cng_level; -//#else - hyp_event_notify(cpu_mask); - local_irq_restore(flags); - return 0; -#endif drop: netdev_rx_stat[this_cpu].dropped++; @@ -943,8 +900,6 @@ void flush_rx_queue(void) while ( (skb = skb_dequeue(¤t->net_vif_list[nvif]->skb_list)) != NULL ) { -if (nvif > 0) -printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vif_list[nvif]->id, skb->pkt_type); /* * Write the virtual MAC address into the destination field * of the ethernet packet. Furthermore, do the same for ARP @@ -952,15 +907,15 @@ printk("flushrxqueue on vif %d (sys: %d) (pkt_type=%d)\n", nvif, current->net_vi * is always 00-00-00-00-00-00. * * Actually, the MAC address is now all zeros, except for the - * first sixteen bits, which are the per-host vif id. - * (so eth0 should be 00-00-..., eth1 is 01-00-...) + * second sixteen bits, which are the per-host vif id. + * (so eth0 should be 00-00-..., eth1 is 00-01-...) */ memset(skb->mac.ethernet->h_dest, 0, ETH_ALEN); - *(unsigned int *)(skb->mac.ethernet->h_dest) = nvif; + *(unsigned int *)(skb->mac.ethernet->h_dest + 1) = nvif; if ( ntohs(skb->mac.ethernet->h_proto) == ETH_P_ARP ) { memset(skb->nh.raw + 18, 0, ETH_ALEN); - *(unsigned int *)(skb->nh.raw + 18) = nvif; + *(unsigned int *)(skb->nh.raw + 18 + 1) = nvif; } i = net_ring->rx_cons; @@ -1978,8 +1933,6 @@ long do_net_update(void) net_ring = current_vif->net_ring; for ( i = net_ring->tx_cons; i != net_ring->tx_prod; i = TX_RING_INC(i) ) { -if (j > 0) -printk("net_update called with packet on vif %d system: %d)\n", j, current_vif->id); if ( copy_from_user(&tx, net_ring->tx_ring+i, sizeof(tx)) ) continue; @@ -2028,40 +1981,21 @@ printk("net_update called with packet on vif %d system: %d)\n", j, current_vif-> net_get_target_vif(skb); if ( skb->dst_vif > VIF_PHYSICAL_INTERFACE ) { -if (j > 0) - printk("Sent to netif_rx.\n"); if (netif_rx(skb) == 0) /* Give up non-local reference. Packet delivered locally. */ kfree_skb(skb); } else if ( skb->dst_vif == VIF_PHYSICAL_INTERFACE ) { -if (j > 0) - printk("Sent to physical device.\n"); skb_push(skb, skb->dev->hard_header_len); dev_queue_xmit(skb); } else { -if (j > 0) - printk("dropped.\n"); kfree_skb(skb); } - /* - skb_get(skb); - skb->protocol = eth_type_trans(skb, skb->dev); - if ( netif_rx(skb) == 0 ) - { - kfree_skb(skb); - } - else - { - skb_push(skb, skb->dev->hard_header_len); - dev_queue_xmit(skb); - } - */ } } net_ring->tx_cons = i; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c index c4b4a9cc9d..b018e29e49 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c @@ -20,7 +20,6 @@ #include #include #include -#include //remove this. #include @@ -226,11 +225,6 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev) unsigned int i; struct net_private *np = (struct net_private *)dev->priv; -if ((np->id > 0) || ((skb->len > 20) - && (skb->nh.iph != NULL) - && (skb->nh.iph->protocol == 1))) - printk(KERN_WARNING "TX on vif %d (dev:%p)\n", np->id, dev); - if ( np->tx_full ) { printk(KERN_WARNING "%s: full queue wasn't stopped!\n", dev->name); @@ -287,17 +281,8 @@ static void network_rx_int(int irq, void *dev_id, struct pt_regs *ptregs) skb->protocol = eth_type_trans(skb, dev); np->stats.rx_packets++; np->stats.rx_bytes += np->net_ring->rx_ring[i].size; - -if (((skb->len > 20) - && ((*(unsigned char *)(skb->data + 9) == 1) || (np->id > 0)) )) - printk(KERN_WARNING "RX on vif %d (dev:%p)\n", np->id, dev); -if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned long *)(skb->data + 16)) == 167903489) - printk(KERN_WARNING "RX INT (driver): pkt_type is %d.!", skb->pkt_type); - netif_rx(skb); dev->last_rx = jiffies; - - } np->rx_idx = i; @@ -307,7 +292,6 @@ if ((skb != NULL) && (skb->data != NULL) && (skb->len > 20) && ntohl(*(unsigned /* Deal with hypervisor racing our resetting of rx_event. */ smp_mb(); if ( np->net_ring->rx_cons != i ) { -//printk("redoing network rx...\n"); goto again; } } @@ -371,7 +355,7 @@ int __init init_module(void) dev->get_stats = network_get_stats; memset(dev->dev_addr, 0, ETH_ALEN); - *(unsigned int *)(dev->dev_addr) = i; + *(unsigned int *)(dev->dev_addr + 1) = i; if ( (err = register_netdev(dev)) != 0 ) { @@ -382,7 +366,6 @@ int __init init_module(void) np->dev = dev; np->id = i; list_add(&np->list, &dev_list); -printk(KERN_WARNING "Added VIF, ifindex is %d.\n", dev->ifindex); } return 0;